package br.fbv.compreja.negocio.produto;

import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import android.content.Context;
import android.util.Log;
import br.fbv.compreja.activity.base.BuzzException;
import br.fbv.compreja.negocio.infra.GetHttp;

public class ProdutoController {

	private static ProdutoController instance;
	private String page;
	private String URL_WS = "http://www.ortomedicape.com.br/precobaixoja/produto/getProduto/";
	private String URL_WS_OF = "http://www.ortomedicape.com.br/precobaixoja/produto/getOfertas";
	private ProdutoDAO dao;

	private ProdutoController(Context context) {
		super();
		dao = new ProdutoDAO(context);
	}

	public static ProdutoController getInstance(Context context) {
		if (instance == null) {
			instance = new ProdutoController(context);
		}
		return instance;
	}

	public boolean existeProduto(String barcode) {
		return dao.existe(barcode);
	}

	public List<Produto> consultarOfertas(int topX) {
		// Alterar este metodo para consultar o Webservice e transforma a lista
		// de objetos JSON em uma lista de objetos Produto
		List<Produto> ofertas = new ArrayList<Produto>();
		JSONArray objreturn = buscarOfertasJSON();

		if (objreturn == null) {
			throw new BuzzException("Produto não Encontrado");
		}
		try {
			for (int i = 0; i < objreturn.length(); i++) {
				JSONObject jsonObj = (JSONObject) new JSONTokener(
						objreturn.getString(i)).nextValue();
				Produto produto = new Produto();
				produto.setBarcode(jsonObj.getString("barcode"));
				produto.setDescricao(jsonObj.getString("descricao"));
				produto.setNome(jsonObj.getString("nome"));
				produto.setPreco(jsonObj.getDouble("preco"));
				produto.setUrlImagemP(jsonObj.getString("url_imagem_p"));
				ofertas.add(produto);
			}
		} catch (JSONException e) {
			throw new BuzzException("JSON mal formado!", e);
		}
		return ofertas;
	}

	public Produto buscarProduto(String barcode) throws UnknownHostException,
			SocketException {
		Produto produto = null;
		if (!existeProduto(barcode)) {
			try {
				produto = buscarProdutoWS(barcode);
			} catch (RuntimeException e1) {
				e1.printStackTrace();
				throw new BuzzException(e1.getMessage());
			} catch (Exception e1) {
				e1.printStackTrace();
				throw new BuzzException(e1.getMessage());
			}
			incluir(produto);
		}
		produto = buscarProdutoBD(barcode);
		return produto;
	}

	private void incluir(Produto produto) {
		dao.incluir(produto);
	}

	private Produto buscarProdutoBD(String barcode) {
		return dao.buscar(barcode);
	}

	private Produto buscarProdutoWS(String barcode) {
		Produto produto = new Produto();
		JSONObject objreturn;
		try {
			objreturn = buscarProdutoJSON(barcode);
			if (objreturn == null) {
				throw new BuzzException("Produto não Encontrado");
			}
			try {
				produto.setBarcode(objreturn.getString("barcode"));
				produto.setDescricao(objreturn.getString("descricao"));
				produto.setNome(objreturn.getString("nome"));
				produto.setPreco(objreturn.getDouble("preco"));
				produto.setUrlImagemP(objreturn.getString("url_imagem_p"));

				JSONObject fotos = objreturn.getJSONObject("outras_imagens");
				produto.addImagem(fotos.getString("foto0"));
				produto.addImagem(fotos.getString("foto1"));
				produto.addImagem(fotos.getString("foto2"));
				produto.addImagem(fotos.getString("foto3"));
			} catch (JSONException e) {
				throw new BuzzException("JSON mal formado!", e);
			}
		} catch (UnknownHostException e1) {
			e1.printStackTrace();
			throw new BuzzException(e1.getMessage());
		} catch (SocketException e1) {
			e1.printStackTrace();
			throw new BuzzException(e1.getMessage());
		} catch (RuntimeException e1) {
			e1.printStackTrace();
			throw new BuzzException(e1.getMessage());
		} catch (Exception e1) {
			e1.printStackTrace();
			throw new BuzzException(e1.getMessage());
		}

		return produto;
	}

	private JSONObject buscarProdutoJSON(String barcode) throws Exception,
			UnknownHostException, SocketException, RuntimeException {
		JSONObject message = null;
		try {
			GetHttp http = new GetHttp(URL_WS + barcode);
			page = http.page;
			JSONObject object = (JSONObject) new JSONTokener(page).nextValue();
			message = object.getJSONObject("produto");

			Log.d("WS", "Retorno WS -> " + message.getBoolean("error"));
			if (message.getBoolean("error")) {
				String msg_error = "";
				if ("EMPTY".equals(message.getString("error_msg"))) {
					msg_error = "Falta de parametros";
				} else {
					msg_error = "Produto não encontrado";
				}
				throw new BuzzException(msg_error);
			}
		} catch (RuntimeException e) {
			e.printStackTrace();
			throw new BuzzException(e.getMessage(), e);
		} catch (SocketException e) {
			e.printStackTrace();
			throw new BuzzException(e.getMessage(), e);
		} catch (UnknownHostException e) {
			e.printStackTrace();
			throw new BuzzException(e.getMessage(), e);
		} catch (Exception e) {
			e.printStackTrace();
			throw new BuzzException(e.getMessage(), e);
		}
		return message;
	}

	private JSONArray buscarOfertasJSON() {
		JSONArray message = null;
		try {
			GetHttp http = new GetHttp(URL_WS_OF);
			page = http.page;
			JSONObject object = (JSONObject) new JSONTokener(page).nextValue();
			message = object.getJSONArray("produtos");
		} catch (SocketException e) {
			e.printStackTrace();
			throw new BuzzException(e.getMessage(), e);
		} catch (UnknownHostException e) {
			throw new BuzzException(e.getMessage(), e);
		} catch (Exception e) {
			e.printStackTrace();
			throw new BuzzException(e.getMessage(), e);
		}
		return message;
	}
}
